#include <iostream>
#include "../include/muduo/net/TcpServer.h"
#include "../include/muduo/net/EventLoop.h"
#include "../include/muduo/net/TcpConnection.h"
#include <functional>
#include <string>
#include <unordered_map>

class TranslateServer
{
    public:
        TranslateServer(int port)
            :_server(&_baseloop,muduo::net::InetAddress("0.0.0.0",port),"TranslateServer",
            muduo::net::TcpServer::kReusePort)
        {
            // bind记得取地址。
            _server.setConnectionCallback(std::bind(&TranslateServer::onConnection,this,std::placeholders::_1));
            _server.setMessageCallback(std::bind(&TranslateServer::onMessage,this,std::placeholders::_1
            ,std::placeholders::_2,std::placeholders::_3));
        }
        // 服务器启动窗口
        void Start()
        {
           _server.start(); // 开始事件监听
           _baseloop.loop(); // 开始事件监控，这是一个死循环阻塞接口。
        }
    private:
        std::string Translate(const std::string& s)
        {
            // 这里只是随便测一下的。
            static std::unordered_map<std::string,std::string> translate = 
            {
                { "Hello" , "你好" } ,
                { "Healthy" , "健康" }
            };

            std::unordered_map<std::string,std::string>::iterator pos = translate.find(s);
            if(pos == translate.end())
            {
                return "None";
            }

            return pos->second;
        }
        // 回调函数，在链接建立成功或是关闭连接则执行此函数。
        void onConnection(const muduo::net::TcpConnectionPtr& conn)
        {
            if(conn->connected() == true)
            {
                std::cout << "新连接建立成功" << std::endl;
            }
            else
            {
                std::cout << "链接关闭" << std::endl;
            }
        }
        // 如果通信请求发送成功的回调函数，意味着接收到了。
        void onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buffer,muduo::Timestamp)
        {
            // 1.buf将请求的数据取出来。
            std::string str = buffer->retrieveAllAsString();
            // 2.调用translate接口进行翻译。
            std::string response = Translate(str);
            // 3.对客户端进行响应结果。
            conn->send(response);
        }
    private:
        // _baseloop是epoll的事件监控，会进行描述的事件监控，触发监控后的I/O操作。
        muduo::net::EventLoop _baseloop;
        // 这个server对象，主要用于设置回调函数，用于告诉服务器收到什么请求该如何操作。
        muduo::net::TcpServer _server;
};

int main()
{
    TranslateServer server(8085);
    server.Start();
    ;

    return 0;
}